

import bpy

from 节点.全局控制.Node.节点和插座基类 import bl_节点基类

import Core.bl_UI配色 as UI配色

import engine.initLIB.load_dll as engineLib
import ctypes



engineLib.flexCAPI.f_创建I8_Array1D_变量节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建I32_Array1D_变量节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建F32_Array2D_变量节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建iVec3Array1D值节点.restype = ctypes.c_bool





E_变量初始化方式枚举 = [
	("TYPE_单值", "单值", "", 0),
	("TYPE_区间", "区间", "", 1),
	("TYPE_随机", "随机", "", 2),
]




def f_显示隐藏随机范围值插座(self):
	if self.m_变量初始化方式 == 'TYPE_随机' :
		self.inputs['随机范围'].hide = False
		self.inputs['初始值'].hide = True
	else:
		self.inputs['随机范围'].hide = True
		self.inputs['初始值'].hide = False

def f_update_变量初始化方式(self, context):
	data = list(str(self.m_变量初始化方式))
	engineLib.flexCAPI.f_node_传入BL数据(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), ctypes.py_object(data));
	
	#f_显示隐藏随机范围值插座(self)
		
	if context :
		self.id_data.f_节点数据更新_更新树([self])











class C_Node_I8_Array1D_变量(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_I8_Array1D_变量'
	bl_label = 'I8_1D 变量'

	m_变量初始化方式 = bpy.props.EnumProperty(items=E_变量初始化方式枚举, update=f_update_变量初始化方式)
	def init(self, context):
		super(C_Node_I8_Array1D_变量, self).f_init(context)
		self.inputs.new('C_Socket_UI32', name='数量')
		self.inputs.new('C_Socket_I8', name='初始值')
		self.inputs.new('C_Socket_Vec2', name='随机范围')
		self.outputs.new('C_Socket_I8_Array1D', name='var')
		
		self.use_custom_color = True
		self.color = UI配色.g_内部节点颜色
		self.f_toCPP(self.id_data)
		self.inputs['数量'].f_setData(1)
		
	def draw_buttons(self, context, layout):
		layout.prop(self, "m_变量初始化方式", text="初始化方式")
		
	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建I8_Array1D_变量节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.inputs['数量'].f_update()
			self.inputs['初始值'].f_update()
			self.inputs['随机范围'].f_update()
			f_update_变量初始化方式(self, None)


	
class C_NODE_MENU_I8_Array1D_变量(bpy.types.Operator):
	bl_idname = 'node.global_node_i8_1d_var'
	bl_label = 'I8_1D 变量'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_I8_Array1D_变量', use_transform=True)
		return {'FINISHED'}
		















class C_Node_F32_Array1D_变量(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_F32_Array1D_变量'
	bl_label = 'F32_Array1D_变量'

	m_变量初始化方式 = bpy.props.EnumProperty(items=E_变量初始化方式枚举, update=f_update_变量初始化方式)
	def init(self, context):
		super(C_Node_F32_Array1D_变量, self).f_init(context)
		self.inputs.new('C_Socket_UI32', name='数量')
		self.inputs.new('C_Socket_F32', name='初始值')
		self.inputs.new('C_Socket_Vec2', name='随机范围')
		self.outputs.new('C_Socket_F32_Array1D', name='var')

		self.use_custom_color = True
		self.color = UI配色.g_内部节点颜色
		self.f_toCPP(self.id_data)
		self.inputs['数量'].f_setData(1)
		
	def draw_buttons(self, context, layout):
		layout.prop(self, "m_变量初始化方式", text="初始化方式")
		
	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建F32_Array1D_变量节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.inputs['数量'].f_update()
			self.inputs['初始值'].f_update()
			self.inputs['随机范围'].f_update()
			f_update_变量初始化方式(self, None)

	
class C_NODE_MENU_F32_Array1D_变量(bpy.types.Operator):
	bl_idname = 'node.global_node_f32_1d_var'
	bl_label = 'F32 Array1D 变量'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_F32_Array1D_变量', use_transform=True)
		return {'FINISHED'}













class C_Node_I32_Array1D_变量(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_I32_Array1D_变量'
	bl_label = 'I32_Array1D_变量'

	m_变量初始化方式 = bpy.props.EnumProperty(items=E_变量初始化方式枚举, update=f_update_变量初始化方式)
	def init(self, context):
		super(C_Node_I32_Array1D_变量, self).f_init(context)
		self.inputs.new('C_Socket_UI32', name='数量')
		self.inputs.new('C_Socket_I32', name='初始值')
		self.inputs.new('C_Socket_Vec2', name='随机范围')
		self.outputs.new('C_Socket_I32_Array1D', name='var')

		self.use_custom_color = True
		self.color = UI配色.g_内部节点颜色
		self.f_toCPP(self.id_data)
		self.inputs['数量'].f_setData(1)
		
	def draw_buttons(self, context, layout):
		layout.prop(self, "m_变量初始化方式", text="初始化方式")
		
	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建I32_Array1D_变量节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.inputs['数量'].f_update()
			self.inputs['初始值'].f_update()
			self.inputs['随机范围'].f_update()
			f_update_变量初始化方式(self, None)

	
class C_NODE_MENU_I32_Array1D_变量(bpy.types.Operator):
	bl_idname = 'node.global_node_i32_a1_var'
	bl_label = 'I32_Array1D_变量'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_I32_Array1D_变量', use_transform=True)
		return {'FINISHED'}
		













class C_Node_F32_Array2D_变量(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_F32_Array2D_变量'
	bl_label = 'F32_Array2D_变量'

	m_变量初始化方式 = bpy.props.EnumProperty(items=E_变量初始化方式枚举, update=f_update_变量初始化方式)
	def init(self, context):
		super(C_Node_F32_Array2D_变量, self).f_init(context)
		self.inputs.new('C_Socket_iVec2', name='维度')
		self.inputs.new('C_Socket_F32', name='初始值')
		self.inputs.new('C_Socket_Vec2', name='随机范围')
		self.outputs.new('C_Socket_F32_Array2D', name='var')

		self.use_custom_color = True
		self.color = UI配色.g_内部节点颜色
		self.f_toCPP(self.id_data)

		
	def draw_buttons(self, context, layout):
		layout.prop(self, "m_变量初始化方式", text="初始化方式")
		
	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建F32_Array2D_变量节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.inputs['维度'].f_update()
			self.inputs['初始值'].f_update()
			self.inputs['随机范围'].f_update()
			f_update_变量初始化方式(self, None)

	
class C_NODE_MENU_F32_Array2D_变量(bpy.types.Operator):
	bl_idname = 'node.global_node_f32_2d_var'
	bl_label = 'F32_Array2D_变量'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_F32_Array2D_变量', use_transform=True)
		return {'FINISHED'}
















class C_Node_Vec4_Array1D_变量(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_Vec4_Array1D_变量'
	bl_label = 'vec4 1D 变量'

	m_变量初始化方式 = bpy.props.EnumProperty(items=E_变量初始化方式枚举, update=f_update_变量初始化方式)
	def init(self, context):
		super(C_Node_Vec4_Array1D_变量, self).f_init(context)
		self.inputs.new('C_Socket_UI32', name='数量')
		self.inputs.new('C_Socket_Vec4', name='初始值')
		self.inputs.new('C_Socket_Vec2', name='随机范围')
		self.outputs.new('C_Socket_Vec4_Array1D', name='var')
		
		self.use_custom_color = True
		self.color = UI配色.g_内部节点颜色
		self.f_toCPP(self.id_data)
		self.inputs['数量'].f_setData(1)
		
	def draw_buttons(self, context, layout):
		layout.prop(self, "m_变量初始化方式", text="初始化方式")
		
	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建Vec4Array1D值节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.inputs['数量'].f_update()
			self.inputs['初始值'].f_update()
			self.inputs['随机范围'].f_update()
			f_update_变量初始化方式(self, None)

class C_NODE_MENU_Vec4_Array1D_变量(bpy.types.Operator):
	bl_idname = 'node.global_node_vec4_1d_var'
	bl_label = 'vec4 1D 变量'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_Vec4_Array1D_变量', use_transform=True)
		return {'FINISHED'}










class C_Node_iVec3_Array1D_变量(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_iVec3_Array1D_变量'
	bl_label = 'ivec3 1D 变量'

	m_变量初始化方式 = bpy.props.EnumProperty(items=E_变量初始化方式枚举, update=f_update_变量初始化方式)
	def init(self, context):
		super(C_Node_iVec3_Array1D_变量, self).f_init(context)
		self.inputs.new('C_Socket_UI32', name='数量')
		self.inputs.new('C_Socket_iVec3', name='初始值')
		self.inputs.new('C_Socket_Vec2', name='随机范围')
		self.outputs.new('C_Socket_iVec3_Array1D', name='var')
		
		self.use_custom_color = True
		self.color = UI配色.g_内部节点颜色
		self.f_toCPP(self.id_data)
		self.inputs['数量'].f_setData(1)
		
	def draw_buttons(self, context, layout):
		layout.prop(self, "m_变量初始化方式", text="初始化方式")
		
	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建iVec3Array1D值节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.inputs['数量'].f_update()
			self.inputs['初始值'].f_update()
			self.inputs['随机范围'].f_update()
			f_update_变量初始化方式(self, None)




	
class C_NODE_MENU_iVec3_Array1D_变量(bpy.types.Operator):
	bl_idname = 'node.global_node_ivec3_1d_var'
	bl_label = 'ivec3 1D 变量'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_iVec3_Array1D_变量', use_transform=True)
		return {'FINISHED'}
		











classes = (
	C_Node_I8_Array1D_变量,
	C_NODE_MENU_I8_Array1D_变量,


	C_Node_F32_Array1D_变量,
	C_NODE_MENU_F32_Array1D_变量,


	C_Node_I32_Array1D_变量,
	C_NODE_MENU_I32_Array1D_变量,

	C_Node_F32_Array2D_变量,
	C_NODE_MENU_F32_Array2D_变量,


	C_Node_Vec4_Array1D_变量,
	C_NODE_MENU_Vec4_Array1D_变量,

	C_Node_iVec3_Array1D_变量,
	C_NODE_MENU_iVec3_Array1D_变量,
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)






